package com.xavier.dong.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * MappedByteBuffer  可以让文件 直接在内存（堆外内存）修改，即操作系统不需要 拷贝一次
 *
 * @author XavierDong
 **/
public class MappedByteBufferTest {

    public static void main(String[] args) {

        // rw： 代表 读写
        try (RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw")) {

            // 获取对应的文件通道
            FileChannel fileChannel = randomAccessFile.getChannel();

            /**
             *
             * 参数一：FileChannel.MapMode.READ_WRITE 使用的是 读写 模式
             * 参数二：起始位置，可以直接修改的
             * 参数三：映射到内存的大小， 即 将 文件 1.txt 多少个字节映射到内存中。
             *
             * 可以修改的范围为 0-5
             *
             * 实际类型为：DirectByteBuffer
             *
             *
             */
            MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

            mappedByteBuffer.put(0, ((byte) 'H'));
            mappedByteBuffer.put(3, ((byte) '9'));
            mappedByteBuffer.put(5, ((byte) 'Y')); // IndexOutOfBoundsException

            System.out.println("修改成功！！");


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
